logpoint_ct = 0;
cur_tag = nullptr;
wpt_tmp = nullptr;
+ fs_ptr = nullptr;
break;
case tt_cache_name:
wpt_tmp->notes = cdatastr;
delete rh_link_;
rh_link_ = nullptr;
}
+ fs_ptr = nullptr;
break;
case tt_rte_rtept:
if (link_) {
}
route_add_wpt(rte_head, wpt_tmp);
wpt_tmp = nullptr;
+ fs_ptr = nullptr;
break;
case tt_rte_desc:
rte_head->rte_desc = cdatastr;
delete rh_link_;
rh_link_ = nullptr;
}
+ fs_ptr = nullptr;
break;
case tt_trk_trkseg:
next_trkpt_is_new_seg = 1;
+ fs_ptr = nullptr;
break;
case tt_trk_trkseg_trkpt:
if (link_) {
}
track_add_wpt(trk_head, wpt_tmp);
wpt_tmp = nullptr;
+ fs_ptr = nullptr;
break;
case tt_trk_desc:
trk_head->rte_desc = cdatastr;
// normalization makes them null.
if (gpx_write_version.isNull() || (gpx_write_version < gpx_1_0)) {
fatal(FatalMsg() << MYNAME ": gpx version number"
- << gpx_write_version << "not valid.");
+ << gpx_write_version << "not valid.");
}
writer->setAutoFormatting(true);
if (reader->hasError()) {
fatal(FatalMsg() << MYNAME << "Read error:" << reader->errorString()
- << "File:" << iqfile->fileName()
- << "Line:" << reader->lineNumber()
- << "Column:" << reader->columnNumber());
+ << "File:" << iqfile->fileName()
+ << "Line:" << reader->lineNumber()
+ << "Column:" << reader->columnNumber());
}
}
const gpx_point_type point_type) const
{
const auto* fs_gpxwpt = reinterpret_cast<gpx_wpt_fsdata*>(waypointp->fs.FsChainFind(kFsGpxWpt));
-
+
gpx_write_common_position(waypointp, point_type, fs_gpxwpt);
gpx_write_common_description(waypointp, point_type, fs_gpxwpt);
gpx_write_common_acc(waypointp, fs_gpxwpt);
auto* gmsd = garmin_fs_t::find(waypointp); /* gARmIN sPECIAL dATA */
if (fs_gpx) {
if (! gmsd) {
- fprint_xml_chain(fs_gpx->tag);
+ if (fs_gpx->tag) {
+ if (gpx_write_version > gpx_1_0) {
+ writer->writeStartElement("extensions");
+ }
+ fprint_xml_chain(fs_gpx->tag);
+ if (gpx_write_version > gpx_1_0) {
+ writer->writeEndElement();
+ }
+ }
}
}
if (gmsd && (gpx_write_version > gpx_1_0)) {
writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num));
}
- if (gpx_write_version > gpx_1_0) {
- if (!(opt_humminbirdext || opt_garminext)) {
- const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
- if (fs_gpx) {
- fprint_xml_chain(fs_gpx->tag);
- }
- } else if (opt_garminext) {
- if (rte->line_color.bbggrr > unknown_color) {
- int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
- if (ci > 0) {
- writer->writeStartElement(QStringLiteral("extensions"));
- writer->writeStartElement(QStringLiteral("gpxx:TrackExtension"));
- writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
- .arg(gt_color_name(ci)));
- writer->writeEndElement(); // Close gpxx:TrackExtension tag
- writer->writeEndElement(); // Close extensions tag
- }
+ if (!(opt_humminbirdext || opt_garminext)) {
+ const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
+ if (fs_gpx) {
+ fprint_xml_chain(fs_gpx->tag);
+ }
+ } else if (opt_garminext && (gpx_write_version > gpx_1_0)) {
+ if (rte->line_color.bbggrr > unknown_color) {
+ int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
+ if (ci > 0) {
+ writer->writeStartElement(QStringLiteral("extensions"));
+ writer->writeStartElement(QStringLiteral("gpxx:TrackExtension"));
+ writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
+ .arg(gt_color_name(ci)));
+ writer->writeEndElement(); // Close gpxx:TrackExtension tag
+ writer->writeEndElement(); // Close extensions tag
}
}
}
writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num));
}
- if (gpx_write_version > gpx_1_0) {
- if (!(opt_humminbirdext || opt_garminext)) {
- const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
- if (fs_gpx) {
- fprint_xml_chain(fs_gpx->tag);
- }
- } else if (opt_garminext) {
- if (rte->line_color.bbggrr > unknown_color) {
- int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
- if (ci > 0) {
- writer->writeStartElement(QStringLiteral("extensions"));
- writer->writeStartElement(QStringLiteral("gpxx:RouteExtension"));
- // FIXME: the value to use for IsAutoNamed is questionable.
- writer->writeTextElement(QStringLiteral("gpxx:IsAutoNamed"), rte->rte_name.isEmpty()? QStringLiteral("true") : QStringLiteral("false")); // Required element
- writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
- .arg(gt_color_name(ci)));
- writer->writeEndElement(); // Close gpxx:RouteExtension tag
- writer->writeEndElement(); // Close extensions tag
- }
+ if (!(opt_humminbirdext || opt_garminext)) {
+ const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
+ if (fs_gpx) {
+ fprint_xml_chain(fs_gpx->tag);
+ }
+ } else if (opt_garminext && (gpx_write_version > gpx_1_0)) {
+ if (rte->line_color.bbggrr > unknown_color) {
+ int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
+ if (ci > 0) {
+ writer->writeStartElement(QStringLiteral("extensions"));
+ writer->writeStartElement(QStringLiteral("gpxx:RouteExtension"));
+ // FIXME: the value to use for IsAutoNamed is questionable.
+ writer->writeTextElement(QStringLiteral("gpxx:IsAutoNamed"), rte->rte_name.isEmpty()? QStringLiteral("true") : QStringLiteral("false")); // Required element
+ writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
+ .arg(gt_color_name(ci)));
+ writer->writeEndElement(); // Close gpxx:RouteExtension tag
+ writer->writeEndElement(); // Close extensions tag
}
}
}
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xmlns:foreign="http://www.gpsbabel.org/testonlyschema" version="1.0" creator="hand crafted" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+ <time>2010-10-16T14:27:17Z</time>
+ <wpt lat="36.339560000" lon="-117.422570000">
+ <ele>479.300</ele>
+ <name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
+ <cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
+ <desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
+ </wpt>
+ <wpt lat="36.460850000" lon="-116.865460000">
+ <ele>-55.600</ele>
+ <name>Turn right at Airport Rd</name>
+ <cmt>Turn right at Airport Rd</cmt>
+ <desc>Turn right at Airport Rd</desc>
+ <foreign:something>wpt</foreign:something>
+ </wpt>
+ <wpt lat="36.463640000" lon="-116.879200000">
+ <ele>-67.300</ele>
+ <name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
+ <cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
+ <desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
+ </wpt>
+ <rte>
+ <name>Low Road</name>
+ <desc>Generated from track Route</desc>
+ <foreign:something>rte</foreign:something>
+ <rtept lat="36.339560000" lon="-117.422570000">
+ <ele>479.300</ele>
+ <name>RPT001</name>
+ </rtept>
+ <rtept lat="36.345010000" lon="-117.354270000">
+ <ele>624.300</ele>
+ <name>RPT005</name>
+ <foreign:something>rtept</foreign:something>
+ </rtept>
+ <rtept lat="36.344640000" lon="-117.349030000">
+ <ele>663.700</ele>
+ <name>RPT011</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>meridian</name>
+ <foreign:something>trk</foreign:something>
+ <trkseg>
+ <trkpt lat="30.062183333" lon="-91.610350000">
+ <ele>1.000</ele>
+ <time>2002-05-25T17:06:21.250Z</time>
+ </trkpt>
+ <trkpt lat="30.062783333" lon="-91.610566667">
+ <ele>0.000</ele>
+ <time>2002-05-25T17:09:55.190Z</time>
+ <foreign:something>trkpt</foreign:something>
+ </trkpt>
+ <trkpt lat="30.062700000" lon="-91.608266667">
+ <ele>0.000</ele>
+ <time>2002-05-25T17:12:00.200Z</time>
+ </trkpt>
+ </trkseg>
+ </trk>
+ <foreign:something>eof</foreign:something>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:foreign="http://www.gpsbabel.org/testonlyschema">
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="30.062183333" minlon="-117.422570000" maxlat="36.463640000" maxlon="-91.608266667"/>
+ <wpt lat="36.339560000" lon="-117.422570000">
+ <ele>479.300</ele>
+ <name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
+ <cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
+ <desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
+ </wpt>
+ <wpt lat="36.460850000" lon="-116.865460000">
+ <ele>-55.600</ele>
+ <name>Turn right at Airport Rd</name>
+ <cmt>Turn right at Airport Rd</cmt>
+ <desc>Turn right at Airport Rd</desc>
+ <foreign:something>wpt</foreign:something>
+ </wpt>
+ <wpt lat="36.463640000" lon="-116.879200000">
+ <ele>-67.300</ele>
+ <name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
+ <cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
+ <desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
+ </wpt>
+ <rte>
+ <name>Low Road</name>
+ <desc>Generated from track Route</desc>
+ <foreign:something>rte</foreign:something>
+ <rtept lat="36.339560000" lon="-117.422570000">
+ <ele>479.300</ele>
+ <name>RPT001</name>
+ </rtept>
+ <rtept lat="36.345010000" lon="-117.354270000">
+ <ele>624.300</ele>
+ <name>RPT005</name>
+ <foreign:something>rtept</foreign:something>
+ </rtept>
+ <rtept lat="36.344640000" lon="-117.349030000">
+ <ele>663.700</ele>
+ <name>RPT011</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>meridian</name>
+ <foreign:something>trk</foreign:something>
+ <trkseg>
+ <trkpt lat="30.062183333" lon="-91.610350000">
+ <ele>1.000</ele>
+ <time>2002-05-25T17:06:21.250Z</time>
+ </trkpt>
+ <trkpt lat="30.062783333" lon="-91.610566667">
+ <ele>0.000</ele>
+ <time>2002-05-25T17:09:55.190Z</time>
+ <foreign:something>trkpt</foreign:something>
+ </trkpt>
+ <trkpt lat="30.062700000" lon="-91.608266667">
+ <ele>0.000</ele>
+ <time>2002-05-25T17:12:00.200Z</time>
+ </trkpt>
+ </trkseg>
+ </trk>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xmlns:foreign="http://www.gpsbabel.org/testonlyschema" version="1.1" creator="hand crafted" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
+ <metadata>
+ <time>2010-10-16T14:27:17Z</time>
+ <extensions>
+ <foreign:something>metadata</foreign:something>
+ </extensions>
+ </metadata>
+ <wpt lat="36.339560000" lon="-117.422570000">
+ <ele>479.300</ele>
+ <name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
+ <cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
+ <desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
+ </wpt>
+ <wpt lat="36.460850000" lon="-116.865460000">
+ <ele>-55.600</ele>
+ <name>Turn right at Airport Rd</name>
+ <cmt>Turn right at Airport Rd</cmt>
+ <desc>Turn right at Airport Rd</desc>
+ <extensions>
+ <foreign:something>wpt</foreign:something>
+ </extensions>
+ </wpt>
+ <wpt lat="36.463640000" lon="-116.879200000">
+ <ele>-67.300</ele>
+ <name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
+ <cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
+ <desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
+ </wpt>
+ <rte>
+ <name>Low Road</name>
+ <desc>Generated from track Route</desc>
+ <extensions>
+ <foreign:something>rte</foreign:something>
+ </extensions>
+ <rtept lat="36.339560000" lon="-117.422570000">
+ <ele>479.300</ele>
+ <name>RPT001</name>
+ </rtept>
+ <rtept lat="36.345010000" lon="-117.354270000">
+ <ele>624.300</ele>
+ <name>RPT005</name>
+ <extensions>
+ <foreign:something>rtept</foreign:something>
+ </extensions>
+ </rtept>
+ <rtept lat="36.344640000" lon="-117.349030000">
+ <ele>663.700</ele>
+ <name>RPT011</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>meridian</name>
+ <extensions>
+ <foreign:something>trk</foreign:something>
+ </extensions>
+ <trkseg>
+ <trkpt lat="30.062183333" lon="-91.610350000">
+ <ele>1.000</ele>
+ <time>2002-05-25T17:06:21.250Z</time>
+ </trkpt>
+ <trkpt lat="30.062783333" lon="-91.610566667">
+ <ele>0.000</ele>
+ <time>2002-05-25T17:09:55.190Z</time>
+ <extensions>
+ <foreign:something>trkpt</foreign:something>
+ </extensions>
+ </trkpt>
+ <trkpt lat="30.062700000" lon="-91.608266667">
+ <ele>0.000</ele>
+ <time>2002-05-25T17:12:00.200Z</time>
+ </trkpt>
+ <extensions>
+ <foreign:something>trkseg</foreign:something>
+ </extensions>
+ </trkseg>
+ </trk>
+ <extensions>
+ <foreign:something>eof</foreign:something>
+ </extensions>
+</gpx>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.1" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:foreign="http://www.gpsbabel.org/testonlyschema">
+ <metadata>
+ <time>1970-01-01T00:00:00Z</time>
+ <bounds minlat="30.062183333" minlon="-117.422570000" maxlat="36.463640000" maxlon="-91.608266667"/>
+ </metadata>
+ <wpt lat="36.339560000" lon="-117.422570000">
+ <ele>479.300</ele>
+ <name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
+ <cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
+ <desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
+ </wpt>
+ <wpt lat="36.460850000" lon="-116.865460000">
+ <ele>-55.600</ele>
+ <name>Turn right at Airport Rd</name>
+ <cmt>Turn right at Airport Rd</cmt>
+ <desc>Turn right at Airport Rd</desc>
+ <extensions>
+ <foreign:something>wpt</foreign:something>
+ </extensions>
+ </wpt>
+ <wpt lat="36.463640000" lon="-116.879200000">
+ <ele>-67.300</ele>
+ <name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
+ <cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
+ <desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
+ </wpt>
+ <rte>
+ <name>Low Road</name>
+ <desc>Generated from track Route</desc>
+ <extensions>
+ <foreign:something>rte</foreign:something>
+ </extensions>
+ <rtept lat="36.339560000" lon="-117.422570000">
+ <ele>479.300</ele>
+ <name>RPT001</name>
+ </rtept>
+ <rtept lat="36.345010000" lon="-117.354270000">
+ <ele>624.300</ele>
+ <name>RPT005</name>
+ <extensions>
+ <foreign:something>rtept</foreign:something>
+ </extensions>
+ </rtept>
+ <rtept lat="36.344640000" lon="-117.349030000">
+ <ele>663.700</ele>
+ <name>RPT011</name>
+ </rtept>
+ </rte>
+ <trk>
+ <name>meridian</name>
+ <extensions>
+ <foreign:something>trk</foreign:something>
+ </extensions>
+ <trkseg>
+ <trkpt lat="30.062183333" lon="-91.610350000">
+ <ele>1.000</ele>
+ <time>2002-05-25T17:06:21.250Z</time>
+ </trkpt>
+ <trkpt lat="30.062783333" lon="-91.610566667">
+ <ele>0.000</ele>
+ <time>2002-05-25T17:09:55.190Z</time>
+ <extensions>
+ <foreign:something>trkpt</foreign:something>
+ </extensions>
+ </trkpt>
+ <trkpt lat="30.062700000" lon="-91.608266667">
+ <ele>0.000</ele>
+ <time>2002-05-25T17:12:00.200Z</time>
+ </trkpt>
+ </trkseg>
+ </trk>
+</gpx>
gpsbabel -i gpx -f ${REFERENCE}/wptsequence.gpx -o gpx -F ${TMPDIR}/wptsequence.gpx
compare ${REFERENCE}/wptsequence.gpx ${TMPDIR}/wptsequence.gpx
+# passthrough
+# gpx 1.0
+# we lose any extensions at the end of file - we don't have a place to store them.
+gpsbabel -i gpx -f ${REFERENCE}/gpxpassthrough10.gpx -o gpx -F ${TMPDIR}/gpxpassthrough10~gpx.gpx
+compare ${REFERENCE}/gpxpassthrough10~gpx.gpx ${TMPDIR}/gpxpassthrough10~gpx.gpx
+
+# gpx 1.1
+# we lose the any extensions in metadata, but we are constructing metadata anyway
+# we lose any extensions at the end of each trkseg - we don't have a place to store them.
+# we lose any extensions at the end of file - we don't have a place to store them.
+gpsbabel -i gpx -f ${REFERENCE}/gpxpassthrough11.gpx -o gpx -F ${TMPDIR}/gpxpassthrough11~gpx.gpx
+compare ${REFERENCE}/gpxpassthrough11~gpx.gpx ${TMPDIR}/gpxpassthrough11~gpx.gpx
+
if [ -z "${VALGRIND}" ]; then
set -e
if command -v xmllint > /dev/null;
<xsd:import namespace="http://www.groundspeak.com/cache/1/0/1" schemaLocation="groundspeak/cache101.xsd"/>\r
<xsd:import namespace="http://www.groundspeak.com/cache/1/1" schemaLocation="groundspeak/cache11.xsd"/>\r
<xsd:import namespace="http://www.groundspeak.com/cache/1/2" schemaLocation="groundspeak/cache12.xsd"/>\r
+<xsd:import namespace="http://www.gpsbabel.org/testonlyschema" schemaLocation="testonlyschema.xsd"/>\r
\r
</xsd:schema>\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<xsd:schema\r
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"\r
+ xmlns:foreign="http://www.gpsbabel.org/testonlyschema"\r
+ targetNamespace="http://www.gpsbabel.org/testonlyschema"\r
+ elementFormDefault="qualified">\r
+\r
+ <xsd:annotation>\r
+ <xsd:documentation>\r
+ This schema exist only for regression testing of gpsbabel.\r
+ </xsd:documentation>\r
+ </xsd:annotation>\r
+\r
+ <xsd:element name="something" type="xsd:string"/>\r
+</xsd:schema> \r